local _M = {}

function _M.tryLimit(self,redis,serverName)
	-- 限制请求速率为200 ，req/sec并且允许100 req/sec的突发请求
	-- 就是说我们会把200以上300一下的请求请求给延迟
	-- 超过300的请求将会被拒绝
	-- 前台主要操作这req/sec a 值 设定基础请求的速率，burst  b这个上限速率,使最大值为a+b，超过a小于a+b的会进行延迟处理
	-- 默认200 20
	 local limit_req = require "resty.limit.req"
	  
	 local reqPersecond=redis:hget(serverName,"reqPersecond")
	 local burst=redis:hget(serverName,"burst")
	  if  burst==ngx.null then
	   ngx.log(ngx.ERR,
	            "burst is not set yet: ")
	   burst=20
      end

	  if  reqPersecond==ngx.null then
	   ngx.log(ngx.ERR,
	            "reqPersecond is not set yet: ")
	   reqPersecond=200
      end

	 local lim, err = limit_req.new("my_limit_req_store", tonumber(reqPersecond), tonumber(burst)) -- TODO 设置取值逻辑
	 

	 if not lim then   --申请limit_req对象失败
	    ngx.log(ngx.ERR,
	            "failed to instantiate a resty.limit.req object: ", err)
	    return ngx.exit(500)
	 end
	 local key = ngx.var.binary_remote_addr
	 local delay, err = lim:incoming(key, true)   -- 服务被拒绝时 delay=nil  err=rejected 正常时 两者都是delay值，告诉你多久后这个请求才会被处理，设200 100，自己手动测试就会一直0， x y时，因为最多delay一个请求最大值为1/x 秒

	 if not delay then
	    -- 第二个参数(err)保存着超过请求速率的请求数
	    -- 例如err等于31，意味着当前速率是231 req/sec
	    if err == "rejected" then
	        return ngx.exit(503)
	    end
	    ngx.log(ngx.ERR, "failed to limit req: ", err)
	    return ngx.exit(500)
	 end
	 if delay >= 0.001 then
	    local excess = err
	     ngx.sleep(delay)
	 end
	 
end
-- 分隔字符串
function _M.split2(self,s, delimiter)
	result = {};
	for match in (s..delimiter):gmatch("(.-)"..delimiter) do
	    table.insert(result, match);
	end
	return result;
end

return _M

